#include <iostream>
#include <string>

#include "./accepter.hpp"
#include "./reactor.hpp"
#include "./sock.hpp"

void usage(std::string proc)
{
    std::cout << "usage: " << proc << " + port" << std::endl;
}
    

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        usage(argv[0]);
        exit(1);
    }

    //创建/绑定/监听
    int listen_sock = Sock::Socket();
    //将监听套接字设置为非阻塞
    set_non_block(listen_sock);
    uint16_t ip = (uint16_t)atoi(argv[1]);
    Sock::Bind(listen_sock, ip);
    Sock::Listen(listen_sock, 5);

    //创建Reactor对象
    //Reactor反应堆模式:通过多路转接方案,被动的采用事件派发的方式,反向的去调用事件对应的回调函数
    Reactor* p_reac = new Reactor();
    p_reac->init_reactor();
    
    //向Reactor反应堆中添加事件
    //添加事件需要有事件,所以我们先创建事件
    Event* p_ev = new Event();
    p_ev->_sock = listen_sock;
    p_ev->_p_reactor = p_reac;

    //设置listen_sock的读取回调函数,也就是获取连接
    //我们这里回调函数,就是链接管理器
    p_ev->register_callback(accepter, nullptr, nullptr);

    //将创建好的事件添加到Reactor反应堆中
    p_reac->insert_event(p_ev, EPOLLIN | EPOLLET);

    //开始进行事件的派发
    int timeout = 1000;
    while(true)
    {
        p_reac->dispatcher(timeout);
    }

    return 0;
}
